package cn.rumoss.streams;

import java.io.IOException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class CreatingStreams {

	public static <T> void show(String title,Stream<T> stream) {
		
		final int SIZE = 5;
		List<T> firstElements = stream
				.limit(SIZE + 1)
				.collect(Collectors.toList());
		System.out.println(title + ": ");
		
		for(int i=0;i<firstElements.size();i++) {
			if(i>0)
				System.out.println(", ");
			if(i<SIZE)
				System.out.println(firstElements.get(i));
			else
				System.out.println("...");
		}
		System.out.println();
		
	}
	
	public static void main(String[] args) throws IOException {
		
		Path path = Paths.get("H:/WorkSpace/eclipseSpace/Java8Fundamental/alice30.txt");
		String contents = new String(Files.readAllBytes(path), 
				StandardCharsets.UTF_8);
		
		Stream<String> words = Stream.of(contents.split("\\PL+"));
		show("words", words);
		
		Stream<String> song = Stream.of("gently","down","the","stream");
		show("song", song);
		
		Stream<String> silence = Stream.empty();
		show("silence", silence);
		
		Stream<String> echos = Stream.generate(() -> "Echo");
		show("echos unlimited stream", echos);
		
		Stream<Double> randoms = Stream.generate(Math::random);
		show("randoms unlimited stream", randoms);
		
		Stream<BigInteger> integers = Stream.iterate(BigInteger.ZERO, 
				n -> n.add(BigInteger.ONE));
		show("integers", integers);
		
		Stream<String> wordsAnotherWay = Pattern.compile("\\PL+").splitAsStream(
				contents);
		show("wordsAnotherWay", wordsAnotherWay);
		
		try(Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)){
			show("lines", lines);
		}
		
	}

}
